from tiny_logger import TinyLogger
import matplotlib.pyplot as plt
from loguru import logger

class VisualizationTool:
    """ pandas数据可视化工具封装类
    """
    def __init__(self, cfg = {}):
        """
        cfg {
            # common
            "figure_size": (12, 12)
            "path": 输出路径
            "title": 标题
            "xlabel": -> plot x轴标签
            "ylabel": -> plot y轴标签
            "interval": 1 int -> plot 数据标签间隔 大数据量使用
            "column" -> pie 数据列
        }
        """
        self.cfg = cfg
        TinyLogger("DEBUG")

    def update_cfg(self, cfg):
        self.cfg = cfg

    def pie(self, data):
        """绘制饼图

        Args:
            data: DataFrame 二维数据表
        """
        # labels 标签
        # autopct: 百分比
        # startangle: 开始角度
        # figsize: 大小
        # legend: 显示图例
        data.plot.pie(y=self.cfg["column"], labels=data.index, autopct='%1.1f%%', startangle=90, figsize=self.cfg["figure_size"], legend=True)

        # 设置图表标题
        plt.title(self.cfg["title"])
        # 图例位置
        plt.legend(loc='best')
        # 设置主题样式
        self.set_common_cfg()
        plt.savefig(self.cfg["path"])
        logger.debug(f"save pie into {self.cfg['path']}")

    def set_common_cfg(self):
        plt.style.use('ggplot')  # 应用 ggplot 风格

    def line(self, data):
        """绘制折线图

        Args:
            data: DataFrame 二维数据表, 可以绘制多条折线  所有列均显示
            path: 输出路径
        """
        # kind
        # marker: 点标记格式
        ax = data.plot(kind="line", figsize=self.cfg["figure_size"], marker="o")
        # 为所有列添加数据标签
        for column in data.columns:
            # 添加数据标签
            for index, value in enumerate(data[column]):
                if index % self.cfg["interval"] == 0:
                    plt.text(index, value, f'{value}', ha='center', va='bottom')

        ax.set_title(self.cfg["title"])
        ax.set_xlabel(self.cfg["xlabel"])
        ax.set_ylabel(self.cfg["ylabel"])
        # 添加图例
        # ax.legend()
        # 设置主题样式
        self.set_common_cfg()
        # 显示图表
        plt.savefig(self.cfg["path"])
        logger.debug(f"save pie into {self.cfg['path']}")
